using System;
using System.Collections.Generic;
using System.Text;

using System.Data.Common;

using MakeIT.Framework.Data;
using MakeIT.SGI.ERP.Entidades;

namespace MakeIT.SGI.ERP.Negocios
{
	public partial class SgiDAOT : DAOT
	{

        public PerfilxusuarioVO getPerfilxusuario(int? idPerfilXUsuario)
        {
            return getPerfilxusuario(idPerfilXUsuario, null, null);
        }

        public PerfilxusuarioVO getPerfilxusuario(int? idPerfilXUsuario, int? idPerfil)
        {
            return getPerfilxusuario(idPerfilXUsuario, idPerfil, null);
        }

		public PerfilxusuarioVO getPerfilxusuario(int? idPerfilXUsuario, int? idPerfil, int? idUsuario)
		{
			PerfilxusuarioVO perfilxusuarioVO = null;
			List<PerfilxusuarioVO> listPerfilxusuarioVOs = getPerfilxusuarios(idPerfilXUsuario, idPerfil, idUsuario);
			if (listPerfilxusuarioVOs != null && listPerfilxusuarioVOs.Count > 0)
			{
				perfilxusuarioVO = listPerfilxusuarioVOs[0];
			}
			return perfilxusuarioVO;
		}

		public List<PerfilxusuarioVO> getPerfilxusuarios()
		{
			return getPerfilxusuarios(null, null, null);
		}

		public List<PerfilxusuarioVO> getPerfilxusuarios(int? idPerfilXUsuario)
		{
			return getPerfilxusuarios(idPerfilXUsuario, null, null);
		}

		public List<PerfilxusuarioVO> getPerfilxusuarios(int? idPerfilXUsuario, int? idPerfil, int? idUsuario)
		{
			string where = "WHERE ";
			StringBuilder query = new StringBuilder();

			query.AppendLine("SELECT pxu.idPerfilXUsuario as pxu_idPerfilXUsuario, pxu.idPerfil as pxu_idPerfil, per.perfil as per_perfil, pxu.idUsuario as pxu_idUsuario, pxu.Cadastro as pxu_Cadastro, pxu.CadastradoPor as pxu_CadastradoPor, pxu.Edicao as pxu_Edicao, pxu.EditadoPor as pxu_EditadoPor  ");
			query.AppendLine("FROM perfilxusuario as pxu LEFT OUTER JOIN perfil as per on pxu.idPerfil=per.idPerfil  LEFT OUTER JOIN usuario as usu on pxu.idUsuario=usu.idUsuario  ");
			if (idPerfilXUsuario != null)
			{
				query.AppendLine(where + "pxu.idPerfilXUsuario=@idPerfilXUsuario ");
				where = "AND ";
			}
			if (idPerfil != null)
			{
				query.AppendLine(where + "pxu.idPerfil=@idPerfil ");
				where = "AND ";
			}
			if (idUsuario != null)
			{
				query.AppendLine(where + "pxu.idUsuario=@idUsuario ");
				where = "AND ";
			}


			query.AppendLine("ORDER BY pxu.idPerfilXUsuario ");

			DbCommand cmd = getCommand();
			cmd.CommandText = query.ToString();

			if (idPerfilXUsuario!= null) cmd.Parameters.Add(getParameter(cmd, "@idPerfilXUsuario", idPerfilXUsuario));
			if (idPerfil!= null) cmd.Parameters.Add(getParameter(cmd, "@idPerfil", idPerfil));
			if (idUsuario!= null) cmd.Parameters.Add(getParameter(cmd, "@idUsuario", idUsuario));


			DbDataReader reader = null;
			try
			{
				reader = cmd.ExecuteReader();

				List<PerfilxusuarioVO> listPerfilxusuario = new List<PerfilxusuarioVO>();

				while (reader.Read())
				{
					PerfilxusuarioVO perfilxusuarioVO = PerfilxusuarioVO.CreateVO();
					perfilxusuarioVO.idPerfilXUsuario = reader.GetInt32(reader.GetOrdinal("pxu_idPerfilXUsuario"));
					perfilxusuarioVO.idPerfil = reader.GetInt32(reader.GetOrdinal("pxu_idPerfil"));
					if (!reader.IsDBNull(reader.GetOrdinal("per_perfil")))
						perfilxusuarioVO.idPerfilVO.perfil = reader.GetString(reader.GetOrdinal("per_perfil"));
					perfilxusuarioVO.idUsuario = reader.GetInt32(reader.GetOrdinal("pxu_idUsuario"));
					perfilxusuarioVO.cadastro = reader.GetDateTime(reader.GetOrdinal("pxu_Cadastro"));
					perfilxusuarioVO.cadastradoPor = reader.GetString(reader.GetOrdinal("pxu_CadastradoPor"));
					perfilxusuarioVO.edicao = reader.GetDateTime(reader.GetOrdinal("pxu_Edicao"));
					perfilxusuarioVO.editadoPor = reader.GetString(reader.GetOrdinal("pxu_EditadoPor"));


					listPerfilxusuario.Add(perfilxusuarioVO);
				}
				reader.Close();
				return listPerfilxusuario;
			}
			catch (Exception ex) { throw ex; }
			finally
			{
				if (reader != null && !reader.IsClosed)
					reader.Close();
			}
		}

		public void setPerfilxusuario(PerfilxusuarioVO perfilxusuarioVO)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("UPDATE perfilxusuario ");
			query.AppendLine("SET idPerfil=@idPerfil, idUsuario=@idUsuario, Edicao=@Edicao, EditadoPor=@EditadoPor ");
			query.AppendLine("WHERE idPerfilXUsuario=@idPerfilXUsuario ");

			DbCommand cmd = getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@idPerfilXUsuario", perfilxusuarioVO.idPerfilXUsuario));
			cmd.Parameters.Add(getParameter(cmd, "@idPerfil", perfilxusuarioVO.idPerfil));
			cmd.Parameters.Add(getParameter(cmd, "@idUsuario", perfilxusuarioVO.idUsuario));
			cmd.Parameters.Add(getParameter(cmd, "@Edicao", perfilxusuarioVO.edicao));
			cmd.Parameters.Add(getParameter(cmd, "@EditadoPor", perfilxusuarioVO.editadoPor));

			try
			{
				cmd.ExecuteNonQuery();
			}
			catch (Exception ex) { throw ex; }

		}

		public long newPerfilxusuario(PerfilxusuarioVO perfilxusuarioVO)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("INSERT INTO perfilxusuario ");
			query.AppendLine("  ( idPerfil, idUsuario, Cadastro, CadastradoPor, Edicao, EditadoPor ) ");
			query.AppendLine("VALUES ( @idPerfil, @idUsuario, @Cadastro, @CadastradoPor, @Edicao, @EditadoPor ) ");

			DbCommand cmd = getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@idPerfil", perfilxusuarioVO.idPerfil));
			cmd.Parameters.Add(getParameter(cmd, "@idUsuario", perfilxusuarioVO.idUsuario));
			cmd.Parameters.Add(getParameter(cmd, "@Cadastro", perfilxusuarioVO.cadastro));
			cmd.Parameters.Add(getParameter(cmd, "@CadastradoPor", perfilxusuarioVO.cadastradoPor));
			cmd.Parameters.Add(getParameter(cmd, "@Edicao", perfilxusuarioVO.edicao));
			cmd.Parameters.Add(getParameter(cmd, "@EditadoPor", perfilxusuarioVO.editadoPor));


			try
			{
				cmd.ExecuteNonQuery();

				long newID = 0;
				if (tipo.Equals(DBType.MSSql))
				{
					cmd.CommandText = "SELECT IDENT_CURRENT('perfilxusuario') AS 'Identity' ";
					DbDataReader reader = cmd.ExecuteReader();
					reader.Read();
					newID = (long)reader.GetDecimal(reader.GetOrdinal("Identity"));
					reader.Close();
				}
				else if (tipo.Equals(DBType.MySql))
				{
					newID = ((MySql.Data.MySqlClient.MySqlCommand)cmd).LastInsertedId;
				}
				else if (tipo.Equals(DBType.ODBC))
				{
					//TODO implementar
				}
				else if (tipo.Equals(DBType.ORACLE))
				{
					//TODO implementar
				}
				return newID;
			}
			catch (Exception ex) { throw ex; }

		}

		public void delPerfilxusuario(PerfilxusuarioVO perfilxusuarioVO)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("DELETE FROM perfilxusuario ");
			query.AppendLine("WHERE idPerfilXUsuario=@idPerfilXUsuario ");

			DbCommand cmd = getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@idPerfilXUsuario", perfilxusuarioVO.idPerfilXUsuario));


			try
			{
				cmd.ExecuteNonQuery();
			}
			catch (Exception ex) { throw ex; }

		}
		public int getCountPerfilxusuarioxIdPerfil(int? idPerfil)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("SELECT COUNT(idPerfil) as ocorrencias FROM perfilxusuario WHERE IdPerfil=@IdPerfil ");

			DbCommand cmd = getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@IdPerfil", idPerfil));

			DbDataReader reader = null;
			try
			{
				reader = cmd.ExecuteReader();
				reader.Read();

				int ocorrencias = 0;
				ocorrencias = reader.GetInt32(reader.GetOrdinal("ocorrencias"));
				reader.Close();
				return ocorrencias;
			}
			catch (Exception ex) { throw ex; }
			finally
			{
				if (reader != null && !reader.IsClosed)
					reader.Close();
			}
		}
		public int getCountPerfilxusuarioxIdUsuario(int? idUsuario)
		{
			StringBuilder query = new StringBuilder();

			query.AppendLine("SELECT COUNT(idUsuario) as ocorrencias FROM perfilxusuario WHERE IdUsuario=@IdUsuario ");

			DbCommand cmd = getCommand();
			cmd.CommandText = query.ToString();

			cmd.Parameters.Add(getParameter(cmd, "@IdUsuario", idUsuario));

			DbDataReader reader = null;
			try
			{
				reader = cmd.ExecuteReader();
				reader.Read();

				int ocorrencias = 0;
				ocorrencias = reader.GetInt32(reader.GetOrdinal("ocorrencias"));
				reader.Close();
				return ocorrencias;
			}
			catch (Exception ex) { throw ex; }
			finally
			{
				if (reader != null && !reader.IsClosed)
					reader.Close();
			}
		}
	}
}
